package org.moonlight.jvm.rtda;

/**
 * rtda == runtime data area 运行时数据区
 *
 * Java程序运行时，Java虚拟机存放各式各样的数据的内存区域叫作运行时数据区。
 *
 * 从线程的角度来看，运行时数据区可以分为两块区域：线程共享区 和 线程独占区。
 *   1. 线程共享区{@link org.moonlight.jvm.rtda.share} 需要在 JVM 启动时就创建好(当然也可以动态收缩扩展大小)，在 JVM 退出时销毁。
 *   2. 线程独占区{@link org.moonlight.jvm.rtda.exclusive} 则是在创建线程时才分配给对应的线程，线程退出时销毁。
 *
 * 线程共享区是堆和方法区。对象数据存放在堆中；类数据存放在方法区中，类数据包括字段和方法信息、方法的字节码、运行时常量池等。
 * 方法区只是一个逻辑概念，而实际需要看具体的虚拟机实现，在 1.8 前方法区是挂在堆上，叫做永久代，1.8之后方法区是直接使用的直接内存，叫做元空间。
 *
 * 线程独占区主要是用于模拟CPU，辅助执行Java字节码。线程独占区中包含有 虚拟机栈，本地方法栈，程序计数器。
 *   1. 虚拟机栈: 描述的是Java方法执行的内存模型，生命周期和线程相同。可能产生 SOE、OOM
 *              每个方法执行时都会创建一个栈帧，栈帧中包含：操作数栈、局部变量表、动态连接、方法出口、指向常量池的指针等等方法执行所需要的信息
 *                 a.首先给线程分配一个栈空间，每个线程都有自己的线程栈
 *                 b.在线程执行方法的时候，会把当前方法的相关数据(比如参数/局部变量数/方法栈深),封装成栈帧压入线程栈中
 *                   如果在执行时发现方法里又套了其他方法,那么又会把被调用的方法封装成另一个栈帧,压到栈顶并执行,执行完
 *                   后弹出,如果有返回值就拿到它的返回值,返回给开始执行的那个方法(调用者)并继续执行,如果整个方法执行完毕,线程栈销毁,线程释放资源(如果没有使用线程池的话)
 *   2. 本地方法栈: 和虚拟机栈差不多，只不过虚拟机栈是给虚拟机执行Java方法服务的，本地方法栈是给native方法服务的。可能产生SOE、OOM。
 *   3. 程序计数器(PC): 记录当前线程所执行的字节码的行号. 条件分支、循环跳转、异常处理、线程恢复 都依赖于它. 没有OOM异常
 *                如果当前执行的方法是Java方法那么程序计数器中存储的就是当前正在执行的字节码的行号，否则，当前方法是本地方法，程序计数器中的值没有明确定义
 *
 **/